package 线程池.线程池处理Runnable任务;

import java.util.concurrent.*;

public class Test {
    public static void main(String[] args) {
        // ExecutorService的常用方法
        // 方法名称:
        // 1. void execute(Runnable command): 执行Runnable任务
        // 2. Future<T> submit(Callable<T> task): 执行Callable任务, 返回未来任务对象, 用于获取线程返回的结果
        // 3. void shutdown(): 等全部任务执行完毕后, 再关闭线程池!
        // 4. List<Runnable> shutdownNow(): 立刻关闭线程池, 停止正在执行的任务, 并返回队列中未执行的任务


        // 新任务拒绝测略
        // 1. ThreadPoolExecutor.AbortPolicy : 丢弃任务并抛出RejectedExecutionException异常, 是默认的策略
        // 2. ThreadPoolExecutor.DiscardPolicy : 丢弃任务, 但不抛出异常, 这是不推荐的做法
        // 3. ThreadPoolExecutor.DiscardOldestPolicy : 抛弃队列中等待最久的任务 然后把当前任务加入到对列中
        // 4. ThreadPoolExecutor.CallerRunPolicy : 由主线程负责调用任务的run()方法从而绕过线程池直接执行


        // 1. 通过ThreadPoolExecutor创建一个线程池对象
        ExecutorService pool = new ThreadPoolExecutor(3, 5, 8, TimeUnit.SECONDS, new ArrayBlockingQueue<>(4),
                Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

        Runnable target = new MyRunnable();
        pool.execute(target); // 线程会自动创建一个新线程, 自动处理这个任务, 自动执行
        pool.execute(target); // 线程会自动创建一个新线程, 自动处理这个任务, 自动执行
        pool.execute(target); // 线程会自动创建一个新线程, 自动处理这个任务, 自动执行
        pool.execute(target); // 线程会自动创建一个新线程, 自动处理这个任务, 自动执行
        pool.execute(target); // 线程会自动创建一个新线程, 自动处理这个任务, 自动执行
        pool.execute(target); // 线程会自动创建一个新线程, 自动处理这个任务, 自动执行
        pool.execute(target); // 线程会自动创建一个新线程, 自动处理这个任务, 自动执行
        // 这已经到了所定义的最大队列容纳数了, 所以在这之后就要创建临时线程
        pool.execute(target); // 线程会自动创建一个新线程, 自动处理这个任务, 自动执行
        pool.execute(target); // 线程会自动创建一个新线程, 自动处理这个任务, 自动执行
        // 这里已经到了所有都在忙,队列也满员的情况, 就要开始拒绝任务了
        // pool.execute(target); // 线程会自动创建一个新线程, 自动处理这个任务, 自动执行

        pool.shutdown(); // 等全部任务执行完毕后, 再关闭线程池
        // pool.shutdownNow(); // 立刻关闭线程池, 停止正在执行的任务, 并返回队列中未执行的任务


    }
}
